Echo Bot 打通管線
在電影《雲端情人》裡,能自然對話的人機介面是故事的核心。
要讓「AI 雲端情人」能和我互動,第一步就是建立一個 友好的人機介面。
我選擇大家熟悉的 LINE 作為主要入口,透過 LINE Messaging API 搭配 FastAPI 架設 Webhook,讓使用者訊息能流入我的系統。
使用者在 LINE 發送文字後,LINE 會把事件透過 Webhook POST 到我的後端 /callback
。我利用 line-bot-sdk
解析事件並回覆。本篇完成一個最小可行版本 Echo Bot:用戶傳什麼、我就回什麼,用來驗證整條資料流是否「打通」。
# app.py
# 最小可行 LINE Echo Bot(FastAPI 版本)
import os
from typing import Dict, Any
from fastapi import FastAPI, Header, HTTPException, Request
from fastapi.responses import JSONResponse
from linebot import LineBotApi, WebhookParser
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
CHANNEL_SECRET = os.getenv("CHANNEL_SECRET")
CHANNEL_ACCESS_TOKEN = os.getenv("CHANNEL_ACCESS_TOKEN")
if not CHANNEL_SECRET or not CHANNEL_ACCESS_TOKEN:
raise RuntimeError("請設定環境變數 CHANNEL_SECRET / CHANNEL_ACCESS_TOKEN")
line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)
parser = WebhookParser(CHANNEL_SECRET)
app = FastAPI(title="AI 雲端情人 - Day 3 Echo Bot")
@app.get("/healthz")
async def healthz() -> Dict[str, Any]:
return {"ok": True}
@app.post("/callback")
async def callback(request: Request, x_line_signature: str = Header(None)) -> JSONResponse:
if x_line_signature is None:
raise HTTPException(status_code=400, detail="Missing X-Line-Signature")
body_text = (await request.body()).decode("utf-8")
try:
events = parser.parse(body_text, x_line_signature)
except InvalidSignatureError:
raise HTTPException(status_code=400, detail="Invalid signature")
for event in events:
if isinstance(event, MessageEvent) and isinstance(event.message, TextMessage):
try:
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text) # Echo:原文回覆
)
except Exception as e:
print(f"[ERROR] reply_message failed: {e}")
return JSONResponse({"status": "ok"})